package algorithms.leecode;

import java.util.HashSet;
import java.util.Set;

public class Au65 {
    static Set<Character> fhSet = new HashSet(){{
        add('+');
        add('-');
        add('.');

    }};
    static Set<Character> pmSet = new HashSet(){{
        add('+');
        add('-');

    }};

    static Set<Character> numSet = new HashSet(){{

        add('0');
        add('1');
        add('2');
        add('3');
        add('4');
        add('5');
        add('6');
        add('7');
        add('8');
        add('9');

    }};
    static Set<Character> eSet = new HashSet(){{

        add('e');
        add('E');
    }};

    public static void main(String[] args) {
 //       System.err.println(set.contains('1'));
        System.err.println(new Au65().isNumber("6e+1"));
    }
    public boolean isNumber(String s) {
        char tmp = ' ';
        // 第一个有效字符
        char first = ' ';
        boolean mi = false;
        boolean exe = false;
        char[] chars = s.toCharArray();
        boolean dian = false;
        // 只有一个字符且是符号
        if (chars.length == 1 && fhSet.contains(chars[0])) {
            return false;
        }
        if (eSet.contains(chars[chars.length - 1])) {
            return false;
        }
//        // 两个字符第二个是'.'
//        if (chars.length == 2 && chars[1] == '.') {
//            return false;
//        }
        for (int i = 0; i < chars.length; i++) {
            // 如果出现非富豪且非数字
            if (!fhSet.contains(chars[i]) && !numSet.contains(chars[i])) {
                return false;
            }
            // 如果连续两个字符
            if (fhSet.contains(tmp)  && ((fhSet.contains(chars[i]) && chars[i] != '.')
                    || (i == chars.length - 1 && chars[i] == '.'))) {
                return false;
            }
            if((chars[i] == '+' || chars[i] == '-') && tmp != ' ' && !eSet.contains(chars[i])) {
                return false;
            }
            if(!dian && chars[i] == '.') {
                dian = true;
            } else if(dian && chars[i] == '.') {
                return false;
            }

            // 最后一个字符是0或者符号
            if (i == (chars.length - 1) && (chars[i] == '-' || chars[i] == '+' )) {
                return false;
            }
            // if (mi && chars[chars.length - 1] == '0' && chars[chars.length - 2] != '.') {
            //     return false;
            // }
            if (i == 1 && eSet.contains(chars[i]) && fhSet.contains(tmp)) {
                return false;
            }

            if (exe && eSet.contains(chars[i])) {
                return false;
            }
            if (eSet.contains(chars[i])) {
                exe = true;
            }
            // 第一个字符
            if (i == 0) {
                if (eSet.contains(chars[i])) {
                    return false;
                }
                tmp = chars[i];
                continue;
            }
            // 第二个字符
            if (chars[i] == '.') {
                mi = true;
            }
            if (exe && chars[i] == '.') {
                return false;
            }
            tmp = chars[i];


        }
        return true;
    }
}
